import Vue from 'vue'
import VueRouter from 'vue-router'
import company from '@/views/home/company/company.vue'
// 导入store  store === this.$store
import store from '@/store'
// 导入utils工具型方法
import { getToken } from '@/utils/token.js'
// 导入获取用户信息方法
import { auInfo } from '@/api/my.js'
Vue.use(VueRouter)

const routes = [
  {
    path: '/',
    redirect: '/login'
  },
  {
    path: '/login',
    component: () => import('@/views/login/login.vue')
  },
  {
    path: '/home',
    component: () => import('@/views/home/home.vue'),
    // 路由重定向 一进来就看到这个页面
    redirect: '/home/my',
    // 配置子组件的路由信息 嵌套路由
    children: [
      {
        path: '/home/company', // 路由地址
        meta: {
          needTab: true
        },
        component: company
      },
      {
        path: '/home/question', // 路由地址
        meta: {
          needLogin: true,
          needTab: true
        },
        component: () => import('@/views/home/question/question.vue')
      },
      {
        path: '/home/find', // 路由地址
        meta: {
          needTab: true
        },
        component: () => import('@/views/home/find/find.vue')
      },
      {
        path: '/home/my', // 路由地址
        meta: {
          needLogin: true,
          needTab: true
        },
        component: () => import('@/views/home/my/my.vue')
      },
      {
        path: '/home/myInfo', // 路由地址
        meta: {
          needLogin: true
        },
        component: () => import('@/views/home/my/myInfo.vue')
      },
      {
        path: '/home/editInfo',
        meta: {
          needLogin: true
        },
        component: () => import('@/views/home/my/editInfo.vue')
      }
    ]
  }
]

const router = new VueRouter({
  routes
})
// 前置守卫
router.beforeEach((to, from, next) => {
  // to 要去的路由信息
  // from 从哪里来的路由信息
  // next 正常通过  next(path地址)
  /*
  如果to的页面不需要登录 就直接通过
  需要登录的：
      如果已经登录 不用处理 直接通过
      如果没有登录
            判断有没有token
              如果有token  通过token获取用户信息后next
              如果没有token  直接返回登录页 next('/login')
              直接写会有一个弊端 那就是不需要请求用户信息的页面也会进行请求 会有不必要的麻烦 所以使用一个变量进行控制 meta.needLogin
    */
  if (!to.meta.needLogin) {
    next()
  } else {
    if (store.state.isLogin) {
      next()
    } else {
      if (getToken('token')) {
        auInfo().then(res => {
          // 将用户信息保存到vuex
          store.commit('setUserInfo', res.data.data)
          // 修改用户登录状态
          store.commit('setIsLogin', true)
          next()
        })
      } else {
        /*
          路由传值
            传 this.$router.push('地址?参数名=值')
            收 在相应路由接收this.$route.query.参数名
            fullPath: 带了参数的路由地址
            path 路由地址
        */
        next('login?redirect=' + to.fullPath)
      }
    }
  }
})
// 获取原型对象上的push函数
const originalPush = VueRouter.prototype.push
// 修改原型对象中的push方法
VueRouter.prototype.push = function push (location) {
  return originalPush.call(this, location).catch(err => err)
}
export default router
